'''

数据预处理：
将文本数据合并成一个字段。
对文本进行清洗和预处理，如去除标点符号、停用词等。
使用TF-IDF对文本进行向量化。
模型训练：
使用支持向量机（SVM）进行分类训练。
可视化：
可视化特征的重要性或使用降维技术（如PCA）对特征进行可视化。
'''
import pandas as pd
import numpy as np
import re
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.decomposition import PCA
import nltk
from nltk.corpus import stopwords

# 下载停用词（仅第一次需要）
#nltk.download('stopwords')

# 加载数据
df = pd.read_csv('D:/project/heimabigdata/kaggle项目班/lesson2/new stock/input/Combined_News_DJIA.csv')

# 自定义文本清洗函数
def clean_text(text):
    # 移除引号和多余引号标记
    text = str(text).replace('"', '').replace("'", '')
    # 移除非字母字符（保留空格）
    text = re.sub(r'[^a-zA-Z\s]', ' ', text)
    # 移除数字
    text = re.sub(r'\d+', ' ', text)
    # 转为小写
    text = text.lower()
    # 分词 + 去除停用词
    words = text.split()
    # stop_words = set(stopwords.words('english'))
    # words = [w for w in words if w not in stop_words and len(w) > 1]  # 去除单个字母
    return ' '.join(words)

# 合并 Top1 - Top25 的新闻
df['Combined'] = df.filter(regex='Top', axis=1).apply(lambda x: ' '.join(x.dropna().astype(str)), axis=1)

# 应用文本清洗函数
df['cleaned_news'] = df['Combined'].apply(clean_text)

# TF-IDF 向量化
tfidf = TfidfVectorizer(max_features=5000)  # 限制最多5000个特征词
X = tfidf.fit_transform(df['cleaned_news'])
y = df['Label']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练 LinearSVC 模型
clf = LinearSVC()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

# 模型评估
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))

# 混淆矩阵可视化
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# 特征重要性可视化
feature_names = np.array(tfidf.get_feature_names_out())
sorted_coef = np.argsort(clf.coef_.flatten())
top_features = np.concatenate((feature_names[sorted_coef[:10]], feature_names[sorted_coef[-10:][::-1]]))
top_coef = np.concatenate((clf.coef_.flatten()[sorted_coef[:10]], clf.coef_.flatten()[sorted_coef[-10:][::-1]]))

plt.figure(figsize=(15, 5))
plt.barh(range(len(top_features)), top_coef, color='skyblue')
plt.yticks(range(len(top_features)), top_features)
plt.title('Top 10 Features Influencing the Prediction')
plt.xlabel('Coefficient Magnitude')
plt.ylabel('Features')
plt.show()

# PCA 降维可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X.toarray())

plt.figure(figsize=(10, 6))
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=y, palette='Set1')
plt.title('PCA Visualization of TF-IDF Features')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
'''
说明：
数据预处理：将Top1到Top25的文本合并成一个字段。
TF-IDF：将合并后的文本数据转换为TF-IDF特征向量。
SVM模型：使用LinearSVC进行分类训练。
评估：使用分类报告和混淆矩阵评估模型性能。
可视化：
使用热图展示混淆矩阵。
展示影响预测的前10个特征。
使用PCA对特征进行降维并可视化。
'''
